using EntitiesAndMappings.Entities;
using System.Collections.Generic;
using NHibernate.SqlCommand;
using NHibernate.Criterion;
using System;
using ProyectoActivos.Dtos;
using NHibernate;
using NHibernate.Transform;

namespace ProyectoActivos.Daos
{
    public class TareoDAO : BaseDAO<Tareo>
    {

        public int CrearFechaTareo(DateTime fecha)
        {
            int cantidadRegistros;
            
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    cantidadRegistros = int.Parse(session.GetNamedQuery("CrearFechaTareo")
                                    .SetParameter("FechaTareo",fecha) 
                                    .UniqueResult().ToString());
                    transaction.Commit();
                }

            }
            return cantidadRegistros;
        }

        public int DuplicarFechaTareo(DateTime fechaADuplicar,DateTime fechaNueva)
        {
            int cantidadRegistros;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    cantidadRegistros = int.Parse(session.GetNamedQuery("DuplicarFechaTareo")
                                    .SetParameter("FechaADuplicar", fechaADuplicar.Date)
                                    .SetParameter("FechaNueva", fechaNueva.Date)
                                    .UniqueResult().ToString());
                    transaction.Commit();
                }

            }
            return cantidadRegistros;
        }
        

        public IList<Tareo> Buscar(Tareo tareo)
        {
            IList<Tareo> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Tareo>()
                        .CreateAlias("Trabajador", "Trabajador", JoinType.InnerJoin)
                        .CreateAlias("Proyecto", "Proyecto", JoinType.InnerJoin)
                        .CreateAlias("Lote", "Lote", JoinType.InnerJoin)
                        .CreateAlias("Lugar", "Lugar", JoinType.LeftOuterJoin);
                        

                    criteria.Add(Restrictions.Eq("Fecha", tareo.Fecha.Date));

                    if(!String.IsNullOrEmpty(tareo.Trabajador.Apellidos))
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.Apellidos", tareo.Trabajador.Apellidos, MatchMode.Start));
                    }

                    if (!String.IsNullOrEmpty(tareo.Trabajador.Nombres))
                    {
                        criteria.Add(Expression.InsensitiveLike("Trabajador.Nombres", tareo.Trabajador.Nombres, MatchMode.Start));
                    }

                    if (tareo.Proyecto != null && tareo.Proyecto.Id > 0)
                    {
                        criteria.Add(Restrictions.Eq("Proyecto.Id", tareo.Proyecto.Id));
                    }

                    if (tareo.Lote != null && tareo.Lote.Id > 0)
                    {
                        criteria.Add(Restrictions.Eq("Lote.Id", tareo.Lote.Id));
                    }

                    if (tareo.Lugar!= null && tareo.Lugar.Id > 0)
                    {
                        criteria.Add(Restrictions.Eq("Lugar.Id", tareo.Lugar.Id));
                    }

                    if (tareo.TipoTrabajoTareo != 0)
                    {
                        criteria.Add(Restrictions.Eq("TipoTrabajoTareo", tareo.TipoTrabajoTareo));
                    }


                     criteria.AddOrder(Order.Asc("Trabajador.Apellidos"))
                        .AddOrder(Order.Asc("Trabajador.Nombres"));


                    lista = criteria.List<Tareo>();
                    transaction.Commit();
                }

            }
            return lista;
        }


        public IList<ConsultaTareoDTO> ConsultaTareo(ConsultaTareoParams tareo)
        {

            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {

                    IQuery query = session.GetNamedQuery("ConsultaTareo");

                    query.SetString("Apellidos", tareo.Apellidos)
                        .SetString("Nombres", tareo.Nombres)
                        .SetInt32("IdProyecto", tareo.IdProyecto)
                        .SetInt32("IdLote", tareo.IdLote)
                        .SetInt32("IdLugar", tareo.IdLugar)
                        .SetDateTime("FechaDesde", tareo.FechaDesde)
                        .SetDateTime("FechaHasta", tareo.FechaHasta);
                    return query.SetResultTransformer(Transformers.AliasToBean(typeof(ConsultaTareoDTO))).List<ConsultaTareoDTO>() as List<ConsultaTareoDTO>;
                }

            }
        }

    }
}